package com.person.commons.utils;

import java.io.Serializable;
import java.util.List;

import com.person.sys.model.SysLog;

public interface DAO {

	/**
	 * 新增一个BEO对象，在数据库插入一条记录
	 * 
	 * @param beo
	 *            要新增的BEO对象
	 * @return 主键对象
	 */
	public abstract Serializable save(Object beo);

	/**
	 * 删除一个BEO对象，在数据库删除一条记录
	 * 
	 * @param beo
	 *            要删除的BEO对象
	 */
	public abstract void delete(Object beo);

	/**
	 * 根据主键对象删除一个BEO，在数据库删除一条记录
	 * 
	 * @param beoCls
	 *            要删除的BEO所属类
	 * @param pk
	 *            BEO主键对象
	 */
	public abstract void delete(Class beoCls, Serializable pk);

	/**
	 * 根据HQL语句批量删除或更新BEO，在数据库批量删除或更新记录，如： <br>
	 * dao.updateBulk("delete from Ab01 ab01");<br>
	 * dao.updateBulk("update Ab01 ab01 set ab01.aab004='test' where
	 * ab01.CompositeId.aab034='1000000001'");
	 * 
	 * @param hql
	 *            要批量删除或更新BEO的HQL语句
	 * @return 删除或更新的记录数
	 */
	public abstract int updateBulk(String hql);

	/**
	 * 根据HQL语句批量删除或更新BEO，在数据库批量删除或更新记录，如： <br>
	 * dao.updateBulk("delete from Ab01 ab01 where ab01.CompositeId.aab034=?",
	 * "1000000001"); <br>
	 * dao.updateBulk("update Ab01 ab01 set ab01.aab004=? where
	 * ab01.CompositeId.aab034='1000000001'", "test");
	 * 
	 * @param hql
	 *            要批量删除或更新BEO的HQL语句
	 * @param value
	 *            HQL语句中的参数值
	 * @return 删除或更新的记录数
	 */
	public abstract int updateBulk(String hql, Object value);

	/**
	 * 根据HQL语句批量删除或更新BEO，在数据库批量删除或更新记录，如： <br>
	 * dao.updateBulk("delete from Ab01 ab01 where ab01.CompositeId.aab034=? and
	 * ab01.aab004=?", new Object[]{"1000000001", "test"}); <br>
	 * dao.updateBulk("update Ab01 ab01 set ab01.aab004=? where
	 * ab01.CompositeId.aab034=?", new Object[]{"test", "1000000001"});
	 * 
	 * @param hql
	 *            要批量删除或更新BEO的HQL语句
	 * @param value
	 *            HQL语句中的参数值
	 * @return 删除或更新的记录数
	 */
	public abstract int updateBulk(String hql, Object[] values);

	/**
	 * 更新一个BEO对象，在数据库更新一条记录
	 * 
	 * @param beo
	 *            要更新的BEO对象
	 */
	public abstract void update(Object beo);

	/**
	 * 带锁查询
	 * 
	 * @param alias
	 *            HQL查询语句中需要所定的表别名 例如：'aa10' -> from Aa10 aa10 'ab01' ->from
	 *            Ab01 ab01
	 * @param hql
	 *            查询HQL语句
	 * @return
	 */
	public List findWithLock(String alias, final String hql);

	/**
	 * 带锁查询
	 * 
	 * @param alias
	 *            HQL查询语句中需要所定的表别名 例如：'aa10' -> from Aa10 aa10 'ab01' -> 

from
	 *            Ab01 ab01
	 * @param hql
	 *            查询HQL语句
	 * @param values
	 *            HQL语句中的参数值
	 * @return
	 */
	public List findWithLock(String alias, final String hql,
			final Object[] values);

	/**
	 * 根据主键查询BEO对象，从数据库查询一条记录 未查询到则返回null
	 * 
	 * @param beoCls
	 *            BEO所属类
	 * @param pk
	 *            BEO主键对象
	 * @return 查询出的BEO对象
	 */
	public abstract Object find(Class beoCls, Serializable pk);

	/**
	 * 根据传入的HQL查询
	 * 
	 * @param hql
	 *            查询HQL语句
	 * @return 查询结果列表
	 */
	public abstract List find(String hql);

	/**
	 * 根据传入的HQL查询
	 * 
	 * @param hql
	 *            查询HQL语句
	 * @param value
	 *            HQL查询语句中的参数值
	 * @return 查询结果列表
	 */
	public abstract List find(String hql, Object value);

	/**
	 * 根据传入的HQL查询
	 * 
	 * @param hql
	 *            查询HQL语句
	 * @param values
	 *            HQL查询语句中的参数值
	 * @return 查询结果列表
	 */
	public abstract List find(String hql, Object[] values);

	/**
	 * 锁定记录
	 * 
	 * @param entity
	 *            要锁定的记录对象
	 */
	public void lock(Object entity);

	/**
	 * 根据传入的HQL语句和翻页信息做查询
	 * 
	 * @param hql
	 *            查询HQL语句
	 * @param fpi
	 *            翻页信息对象
	 * @return 翻页信息对象
	 */
	public abstract FlipPageInfo findWithPaging(final String hql,
			final FlipPageInfo fpi);

	/**
	 * 根据传入的HQL语句和翻页信息做查询
	 * 
	 * @param hql
	 *            查询HQL语句
	 * @param fpi
	 *            翻页信息对象
	 * @param value
	 *            HQL查询语句中的参数值
	 * @return 翻页信息对象
	 */
	public abstract FlipPageInfo findWithPaging(final String hql,
			final FlipPageInfo fpi, final Object value);

	/**
	 * 根据传入的HQL语句和翻页信息做查询
	 * 
	 * @param hql查询HQL语句
	 * @param fpi
	 *            翻页信息对象
	 * @param value
	 *            HQL查询语句中的参数值
	 * @return 翻页信息对象
	 */
	public abstract FlipPageInfo findWithPaging(final String hql,
			final FlipPageInfo fpi, final Object[] values);
	/**
	 * 根据传入的HQL语句和翻页信息做查询
	 * 
	 * @param hql查询HQL语句
	 * @param fpi
	 *            翻页信息对象
	 * @param value
	 *            HQL查询语句中的参数值
	 * @param countString
	 *           用于代替count(*)中*的内容
	 * @return 翻页信息对象
	 */
	public abstract FlipPageInfo findWithPaging(final String hql,
			final FlipPageInfo fpi, final Object[] values,String countString);

	public abstract Object get(String hsql, Object[] params);
	
	
	/**
	 * 该方法负责向sys_log表中增加一条日志记录
	 * 传递的对象中需要设置的参数有：userId,logIp,codeNo,logContent
	 * @return 1 成功 0 失败
	 * @author wang zitao 
	 *
	 */
	public abstract char createLog(SysLog sysLog);
	public long sumRecords(String sql);
	public int countRecords(String sql);
	/** 该方法用法带复杂条件的删除和更新(直接用SQL语句)*/
	public void delOrUpdate(String sql);
}